package com.cccyy.financial_calculations;

import java.util.Arrays;
import java.util.List;

public class SharpeRatioCalculator {

    /**
     * 计算夏普比率
     * 夏普比率是衡量投资组合每单位总风险的超额回报的指标
     * 它通过计算投资组合的平均回报率超出无风险利率的部分与投资组合回报率的标准差之比得出
     *
     * @param portfolioReturns 投资组合的回报率列表，用于计算平均回报率和标准差
     * @param riskFreeRate 无风险利率，通常采用政府国债的收益率作为参考
     * @return 返回计算出的夏普比率，用于评估投资组合的风险调整后收益
     */
    public static double calculateSharpeRatio(List<Double> portfolioReturns, double riskFreeRate) {
        // 计算投资组合的平均回报率
        double meanReturn = calculateMean(portfolioReturns);
        // 计算投资组合回报率的标准差
        double standardDeviation = calculateStandardDeviation(portfolioReturns, meanReturn);
        // 返回夏普比率，即投资组合的平均回报率超出无风险利率的部分与标准差之比
        return (meanReturn - riskFreeRate) / standardDeviation;
    }

    private static double calculateMean(List<Double> returns) {
        double sum = 0.0;
        for (double value : returns) {
            sum += value;
        }
        return sum / returns.size();
    }

    private static double calculateStandardDeviation(List<Double> returns, double mean) {
        double sumSquaredDifferences = 0.0;
        for (double value : returns) {
            sumSquaredDifferences += Math.pow(value - mean, 2);
        }
        return Math.sqrt(sumSquaredDifferences / returns.size());
    }

    /**
     * 程序入口点
     * 计算并打印夏普比率
     * 夏普比率是金融投资中衡量投资组合每单位总风险所能带来的超额回报的指标
     */
    public static void main(String[] args) {
        // 假设投资组合的回报率列表为：0.05, 0.03, 0.04, 0.02, 0.06
        List<Double> portfolioReturns = Arrays.asList(0.05, 0.03, 0.04, 0.02, 0.06);
        double riskFreeRate = 0.01; // 无风险收益率为1%

        // 计算夏普比率
        double sharpeRatio = calculateSharpeRatio(portfolioReturns, riskFreeRate);
        // 输出夏普比率
        System.out.println("夏普比率: " + sharpeRatio);
    }
}
